package cn.kuporo.seckill.common.lock;

import java.util.concurrent.TimeUnit;

/**
 * @author: kuporo
 * @since: 2025/7/8
 * @description: 分布式锁接口
 */
public interface DistributedLock {
    /**
     * 获取锁，如果锁不可用则一直等待直到锁可用
     */
    void lock();

    /**
     * 获取锁并设置锁自动释放时间
     * @param leaseTime 锁自动释放时间
     * @param unit 时间单位
     */
    void lock(long leaseTime, TimeUnit unit);


    /**
     * 尝试获取锁
     * @return true-获取锁成功 false-获取锁失败
     */
    boolean tryLock() throws InterruptedException;

    /**
     * 尝试获取锁，设置等待时间
     * @param waitTime 等待获取锁的最长时间
     * @param unit 时间单位
     * @return true-获取锁成功 false-获取锁失败
     * @throws InterruptedException 中断异常
     */
    boolean tryLock(long waitTime, TimeUnit unit) throws InterruptedException;
    /**
     * 尝试获取锁，设置等待时间和锁自动释放时间
     * @param waitTime 等待获取锁的最长时间
     * @param leaseTime 锁自动释放时间(获取锁成功后)
     * @param unit 时间单位
     * @return true-获取锁成功 false-获取锁失败
     * @throws InterruptedException 中断异常
     */
    boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;



    /**
     * 释放锁
     */
    void unlock();

    /**
     * 强制释放锁（忽略持有者检查）
     */
    void forceUnlock();

    /**
     * 检查锁是否被当前线程持有
     * @return true-当前线程持有锁 false-当前线程未持有锁
     */
    boolean isHeldByCurrentThread();

    /**
     * 检查锁是否被任意线程持有
     * @return true-锁被持有 false-锁未被持有
     */
    boolean isLocked();

    /**
     * 获取锁的剩余存活时间
     * @return 剩余时间(毫秒)，-1表示锁没有设置过期时间
     */
    long remainTimeToLive();
}
